home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
PET
/
O-Old PET 1979
/
(o)a2.d64
/
sc1.s i_o fix
< prev
next >
Wrap
Text File
|
2007-04-22
|
19KB
|
702 lines
;**************************************
;* *
;* FIXED SCREEN INPUT ROUTINE *
;* BY PAUL HIGGINBOTTOM *
;* (COMMODORE SOFTWARE DEPARTMENT) *
;* *
;**************************************
;
;USES '<' AS OPENING DELIMITER,
;AND '>' AS CLOSING DELIMITER
;OF A FIELD.
;
;LABELS USED:-
;
GET =$FFE4 ;DOES A 'GET'
POINTR =1 ;GENERAL POINTER LO=1,HI=2
ERRFLG =0 ;ERROR FLAG / GENERAL FLAG
OPENDL =60 ;PEEK CODE OF '<' SYMBOL
CLSEDL =62 ;PEEK CODE OF '>' SYMBOL
CRSRLO =196 ;- START ADDRESS OF LINE
CRSRHI =197 ; WHICH CURSOR IS ON
CRSRPN =198 ;CURSOR POSITION (0-LINLEN)
CRSRLN =216 ;CURRENT LINE CURSOR IS ON.
ARRTAB =$2C ;POINTER TO START OF VAR.
ARREND =$2E ;POINTER TO END OF VAR.
ARRPTR =$23 ;POINTER TO ARRAY
STRPTR =$25 ;POINTER TO DATA FROM ARRAY
NUMINS =220 ;NUMBER OF INSERTS LEFT
QTEFLG =205 ;QUOTE FLAG
PIA =155 ;PIA KEYSWITCH FOR RUNSTOP/RVS
;
;ILLEGAL OR CONTROL KEYS :-
;
HME =19 ;HOME CURSOR
CLR =147 ;CLR SCREEN & HOME CURSOR
RVS =18 ;REVERSE FIELD ON
OFFRVS =146 ;REVERSE FIELD OFF
CU =145 ;CURSOR UP
CD =17 ;CURSOR DOWN
CR =29 ;CURSOR RIGHT
CL =157 ;CURSOR LEFT
RTN =13 ;RETURN
DEL =20 ;DELETE
INS =148 ;INSERT
ESC =27 ;ESCAPE
TAB =9 ;TAB CHARACTER
SHFRTN =141 ;SHIFTED RETURN
SHFTAB =137 ;SHIFTED TAB
SHFESC =155 ;SHIFTED ESCAPE
RUNSTP =3 ;RUN/STOP
;
;REQUIRES THAT:-
;EACH FIELD ON THE SCREEN HAS:-
; A '<' AT THE START AND.....
; A '>' AT THE END OF EACH FIELD
;
;**************************************
;* MAIN ENTRY POINT. RESETS POINTERS, *
;* THEN SCANS FOR A FIELD. IF ONE IS *
;* FOUND, THEN THE CODE GOES ON, ELSE *
;* SCREEN ACCEPT MODE IS ENTERED. *
;**************************************
;
BEGIN JSR RESET ;SET POINTERS TO START
MAIN JSR UNFLSH ;UNHIGHLIGHT CURSOR
JSR SCANFD ;SCAN FOR A FIELD
BCC OK ;FOUND ONE - GO ON
;
ACCEPT JSR UNFLSH ;UNHILIGHT CURRENT POSITION
LDA #<ACCMSG ;DO SCREEN ACCEPT
LDY #>ACCMSG ;SET A,Y TO MESSAGE
JSR PRTSTR ;AND PRINT IT
KYLOOP JSR GET ;DO A 'GET'
BEQ KYLOOP ;NOTHING PRESSED - GO BACK
KY CMP #SHFRTN ;IS IT A SHIFTED RETURN ?
BNE KY0 ;NO - GO ON
JMP GETSTR ;YES - GO ON TO READ SCREEN
KY0 CMP #HME ;HOME ?
BNE KY1 ;NO - GO ON
JSR ERASE ;ERASE MESSAGE
JMP BEGIN ;GO DO IT
KY1 CMP #CU ;CURSOR UP ?
BNE KY2 ;NO - GO ON
LDA #1 ;SET FLAG FOR ONE SCAN ONLY
STA ERRFLG ;
JSR ERASE ;ERASE MESSAGE
JSR BD1 ;SCAN BACK TO BOTTOM FIELD
BCS ACCEPT ;IF NOT FOUND - GO BACK
JMP OK ;AND CARRY ON
KY2 CMP #CLR ;CLEAR SCREEN ?
BNE KY3 ;NO - GO ON
JSR ERASE ;ERASE MESSAGE
LDA #CLR ;RESET CLR CHAR
JMP OK4 ;GO DO IT
KY3 CMP #RUNSTP ;RUN/STOP ?
BNE KYLOOP ;NO - GO BACK
LDA #2 ;SET ERROR FLAG TO 2
STA ERRFLG
LDA #$FF ;NULLIFY RUNSTOP FLAG
STA PIA
JMP FINISH ;AND RETURN TO BASIC
;
;**************************************
;* ROUTINE TO CLEAR THE BOTTOM LINE *
;**************************************
;
ERASE LDA #<ERSMSG ;ERASE SCREEN ACCEPT
LDY #>ERSMSG ;SET A,Y TO STRING
JSR PRTSTR ;AND PRINT IT
RTS
;
;**************************************
;* MAIN LOGIC TO HANDLE ALL KEYBOARD *
;* ENTRIES. *
;**************************************
;
OK JSR FDCRSR ;OK - MOVE TO NEXT POSITION
JSR HILGHT ;HILIGHT NEW CRSR POSITION
INPUT JSR GET ;GET A CHARACTER
BEQ INPUT ;NOTHING PRESSED - TRY AGAIN
CMP #CD ;CURSOR DOWN ?
BEQ NXTFLD ;YES - GO ONTO NEXT FIELD
CMP #RTN ;OR A RETURN ?
BNE OK1 ;NO - GO ON
NXTFLD JMP MAIN ;YES - GO ON SCANNING
OK1 CMP #HME ;HOME ?
BNE KYTEST ;NO - GO ON
JSR UNFLSH ;UNHILIGHT PRESENT POSITION
JMP BEGIN ;YES - START AT FIRST FIELD
KYTEST LDX #0 ;ZEROISE TABLE INDEX
TEST CMP NOGOOD,X ;ANY GOOD ?
BEQ INPUT ;NO - GO BACK
INX ;BUMP TABLE INDEX
LDY NOGOOD,X ;END OF TABLE ?
CPY #0
BNE TEST ;NO - CARRY ON
OK2 CMP #SHFRTN ;SHIFTED RETURN ?
BNE OK3 ;NO - GO ON
JMP ACCEPT ;YES - GOTO SCREEN ACCEPT
OK3 CMP #CU ;CURSOR UP ?
BNE OK4 ;NO - GO ON
JSR SAVREG ;YES - SAVE CURSOR POSITION
JSR UNFLSH ;UNHILIGHT CURSOR POSITION
JSR SCANBD ;SCAN BACK TO PREVIOUS FIELD
BCS TOPSCR ;ALREADY IN THE TOP FIELD!
JMP OK ;FINE - CARRY ON INPUTTING
TOPSCR JSR RESREG ;RESET CURSOR POSITION
JSR HILGHT ;RE-HILIGHT CURSOR POSITION
JMP INPUT
OK4 CMP #CLR ;CLEAR SCREEN ?
BNE OK5 ;NO - GO ON
LDA #1 ;YES - SET ERRFLG
STA ERRFLG ;
JMP FINISH ;AND RETURN TO BASIC
OK5 CMP #CL ;CURSOR LEFT ?
BEQ OK6 ;YES - GO ON
CMP #DEL ;DELETE ?
BNE OK7 ;NO - GO ON
OK6 PHA ;SAVE CHARACTER
JSR DECPTR ;LOOK AT LEFT SIDE
LDY #0 ;ZEROISE OFFSET
LDA (POINTR),Y ;GET CHARACTER
CMP #OPENDL ;IS IT AN OPEN DELIMITER ?
BEQ RETURN ;YES - GO ON
JSR INCPTR ;RESET POINTER
PLA ;NO - RETRIEVE CHARACTER
CMP #DEL ;WAS IT A DELETE ?
BNE CRSRLF ;NO - GO ON
JMP DELETE ;YES - GO TO IT
CRSRLF JSR PRTCHR ;NO - PRINT IT
JMP INPUT ;AND GO BACK
RETURN PLA ;FIX STACK
JSR INCPTR ;RESET POINTER
JMP INPUT ;YES - GO BACK
OK7 CMP #INS ;INSERT ?
BNE OK8 ;NO - GO ON
JMP INSERT ;GO TO IT
OK8 CMP #RUNSTP ;RUN/STOP ?
BNE OK9 ;NO - GO ON
JSR UNFLSH ;YES - UNHILIGHT CURSOR POSITION
LDA #2 ;SET ERROR FLAG TO 2
STA ERRFLG
JMP FINISH ;AND RETURN TO BASIC
OK9 PHA ;SAVE CHARACTER
OK10 JSR SAVREG ;SAVE CURSOR POSITION
JSR INCPTR ;MOVE TO RIGHT HAND SIDE
LDY #0 ;ZEROISE OFFSET
LDA (POINTR),Y ;GET CHARACTER
CMP #CLSEDL ;IS IT A CLOSE DELIMITER ?
BEQ NOPRT ;YES - TAKE CARE OF IT
JSR DECPTR ;NO - RESET OLD CRSR POSITION
PLA ;RE-GET CHARCTER
JSR PRTCHR ;PRINT IT PROPERLY !
JMP INPUT ;AND CARRY ON
;
NOPRT JSR DECPTR ;RESET POINTER
JSR UNFLSH ;UNHILIGHT CURSOR POSITION
JSR SAVREG ;SAVE REGISTERS
PLA ;CLEAN UP STACK
JSR PRINT ;PRINT IT
JSR ESCAPE ;DO AN ESCAPE
JSR RESREG ;RESET REGISTERS BACK ONTO
JSR HILGHT ;THE SAME SQUARE AND HILGHT
JMP INPUT ;IT AND CARRY ON
;
;**************************************
;* ROUTINE TO SET POINTER AND CURSOR *
;* TO THE HOME POSITION. *
;**************************************
;
RESET LDA #<SCREEN ;GET LO BYTE OF SCREEN ADDRESS
STA POINTR
LDA #>SCREEN
STA POINTR+1
LDA #HME ;LOAD A 'HOME'
JSR PRINT ;AND PRINT IT
LDA #CD ;LOAD A 'CURSOR DOWN'
JSR PRINT ;AND PRINT IT
LDA #0 ;LOAD A ZERO
STA ERRFLG ;INITIALISE ERROR FLAG
RTS ;AND RETURN
;
;**************************************
;* ROUTINE TO SCAN FORWARD FROM THE *
;* CURRENT CURSOR POSITION TO A FIELD.*
;* THE CARRY IS USED AS A FLAG STATING*
;* WHETHER OR NOT A FIELD WAS FOUND. *
;**************************************
;
SCANFD LDY #0 ;ZEROISE OFFSET
LDA (POINTR),Y ;GET A CHARACTER
CMP #OPENDL ;IS IT AN OPENING DELIMITER ?
BEQ FOUND ;YES - RETURN
JSR FDCRSR ;NO - BUMP POINTER
LDA #>ENDSCR ;GET END OF SCREEN HI
CMP POINTR+1 ;SAME AS POINTER HI ?
BNE SCANFD ;NO - KEEP ON SCANNING
LDA #<ENDSCR ;YES - GET END OF SCREEN LO
CMP POINTR ;SAME AS POINTER LO
BNE SCANFD ;NO - KEEP ON SCANNING
SEC ;YES - SET 'NOT FOUND' FLAG
RTS ;AND GO BACK
FOUND CLC ;SET FOUND FLAG
RTS ;AND GO BACK
;
;**************************************
;* ROUTINE TO SCAN BACKWARDS FROM THE *
;* CURRENT CURSOR POSITION TO A FIELD.*
;* THE CARRY IS USED AS A FLAG STATING*
;* WHETHER OR NOT A FIELD WAS FOUND. *
;**************************************
;
SCANBD LDA #0 ;GET A ZERO
STA ERRFLG ;ZEROISE FLAG
BD1 LDY #0 ;ZEROISE OFFSET
LDA (POINTR),Y ;GET A CHARACTER
CMP #OPENDL ;IS IT AN OPENING DELIMITER ?
BEQ FOUND1 ;YES - FOUND FIELD - GO ON
BD2 JSR BKCRSR ;NO - BUMP POINTER & CURSOR
LDA #>SCREEN ;GET START OF SCREEN HI
CMP POINTR+1 ;SAME AS POINTER HI ?
BNE BD1 ;NO - KEEP ON SCANNING
LDA #<SCREEN ;YES - GET START OF SCREEN LO
CMP POINTR ;SAME AS POINTER LO
BNE BD1 ;NO KEEP ON SCANNING
SEC ;YES - SET 'NOT FOUND' FLAG
RTS ;AND GO BACK
FOUND1 DEC ERRFLG ;DECREMENT FLAG
BEQ FOUND2 ;OK - WE'VE DONE IT
INC ERRFLG ;BUMP IT TO ZERO
INC ERRFLG ;THEN TO ONE
JMP BD2 ;GO DO IT A SECOND TIME
FOUND2 CLC ;SET 'FOUND FLAG'
RTS ;AND RETURN
;
COUNT .BYT 0 ;GENERAL COUNTER/STORE
;
;**************************************
;* ROUTINE TO HANDLE INSERTION KEY. *
;* MOVES ALL CHARACTERS FROM CURSOR *
;* POSITION TO THE END OF THE FIELD *
;* UP ONE PLACE, THUS ERASING THE LAST*
;* CHARACTER IN THE FIELD. THEN A *
;* SPACE IS PRINTED AT THE CURRENT *
;* CURSOR POSITION. *
;**************************************
;
INSERT LDY #0 ;ZEROISE OFFSET
JSR INCPTR ;MOVE ONTO NEXT SQUARE
INS1 LDA (POINTR),Y ;LOOK AT IT
CMP #CLSEDL ;END OF FIELD ?
BEQ INS2 ;YES - GO ON
INY ;NO - BUMP INDEX
BNE INS1 ;AND GO BACK
INS2 STY COUNT ;SAVE INDEX
CPY #0 ;AT END OF FIELD ?
BNE INS3 ;IF NOT AT END - GO ON
JSR DECPTR ;RESET POINTER
JMP NOINST ;AND GO ON
INS3 JSR UNFLSH
JSR DECPTR ;RESET POINTER
LDY COUNT ;RESET INDEX
INY
INS4 DEY
DEY
LDA (POINTR),Y
INY
STA (POINTR),Y
CPY #1 ;FINISHED ?
BNE INS4 ;NO - GO BACK
LDY #0 ;ZEROISE OFFSET
NOINST LDA #160 ;LOAD A RVS SPACE
STA (POINTR),Y ;PUT IT BACK
JMP INPUT ;CARRY ON
;
;**************************************
;* ROUTINE TO HANDLE THE DELETE KEY. *
;* MOVES ALL CHARACTERS FROM END OF *
;* THE FIELD BACK TO THE CURRENT *
;* CURSOR POSITION BACK ONE PLACE AND *
;* PRINTS A SPACE IN THE LAST POSITION*
;* OF THE FIELD. DOES NOT FUNCTION IN *
;* FIRST POSITION OF FIELD. *
;**************************************
;
DELETE JSR UNFLSH ;UNHILIGHT CURSOR POSITION
JSR INCPTR ;MOVE ONTO NEXT SQUARE
LDY #0 ;ZEROISE OFFSET
DEL1 LDA (POINTR),Y ;LOOK AT IT
CMP #CLSEDL ;END OF FIELD ?
BEQ DEL2 ;YES - GO ON
INY ;NO - BUMP INDEX
BNE DEL1 ;AND GO BACK
DEL2 STY COUNT ;SAVE INDEX
JSR DECPTR ;RESET POINTER
JSR DECPTR ;RESET POINTER
LDY #1 ;SET OFFSET
DEL3 LDA (POINTR),Y ;GET A CHARACTER
DEY
STA (POINTR),Y ;MOVE IT
CPY COUNT ;FINSHED ?
BEQ DEL4 ;YES - GO ON
INY ;BUMP IT BACK
INY ;AND ONE MORE
JMP DEL3 ;AND GO BACK
DEL4 INC COUNT ;FIX OFFSET
LDY COUNT ;GET IT
LDA #32 ;LOAD A SPACE
STA (POINTR),Y ;PUT IT ON THE SCREEN
LDA #CL ;MOVE CURSOR, BACK ONE
JSR PRTCHR
JMP INPUT ;AND GO BACK
;
;**************************************
;* ROUTINE TO PRINT A STRING WHICH IS *
;* STORED AT THE ADDRESS IN THE *
;* ACCUMULATOR AND THE Y REGISTER. *
;* PRINTS MESSAGE ON BOTTOM LINE AT *
;* 'MSGPN' WHICH IS DEPENDENT ON THE *
;* SCREEN WIDTH, IN ORDER TO CENTER *
;* THE MESSAGE. *
;**************************************
;
PRTSTR STA POINTR ;PUT A,Y IN POINTER
STY POINTR+1
LDY #0 ;ZEROISE OFFSET
LDA #23 ;SET PRINT AT BOTTOM LINE
STA CRSRLN
LDA #RTN ;PRINT A RETURN
JSR PRINT
LDA #MSGPN ;SET COLUMN
STA CRSRPN
PRLOOP LDA (POINTR),Y ;GET A CHARACTER
BEQ GOBACK ;IF NULL - END OF STRING
JSR PRINT ;PRINT THE CHARACTER
JSR INCPTR ;BUMP THE POINTER
BNE PRLOOP ;AND GO ONTO THE NEXT
GOBACK JMP UPDATE ;FIX POINTER & RTS
;
;**************************************
;* ROUTINE TO INCREMENT THE 16 BIT *
;* POINTER 'POINTR' BY ONE. *
;**************************************
;
INCPTR INC POINTR ;INCREMENT LO BYTE
BNE NOINC ;NOT ZERO - DON'T BUMP HI BYTE
INC POINTR+1 ;BUMP POINTER HI
NOINC RTS
;
;**************************************
;* ROUTINE TO DECREMENT THE 16 BIT *
;* POINTER 'POINTR' BY ONE. *
;**************************************
;
DECPTR LDA POINTR ;GET POINTER LO
BNE NODEC ;NOT ZERO - DON'T BUMP HI BYTE
DEC POINTR+1 ;DECREMENT THE HI BYTE
NODEC DEC POINTR ;DECREMENT THE LO BYTE
RTS
;
;**************************************
;* ROUTINE TO INCREMENT THE 16 BIT *
;* POINTER 'ARRPTR' BY ONE. THIS *
;* POINTER IS USED TO FIND THE SC$ *
;* ARRAY. *
;**************************************
;
ARRINC INC ARRPTR ;INCREMENT LO BYTE
BNE NOINC ;NOT ZERO - DON'T BUMP HI BYTE
INC ARRPTR+1 ;BUMP POINTER HI
RTS
;
;**************************************
;* ROUTINE TO SIMULATE PRINTING A *
;* CURSOR RIGHT CHARACTER. THIS IS *
;* USED INSTEAD OF ACTUALLY PRINTING *
;* A CURSOR RIGHT, BECAUSE IT IS A *
;* GREAT DEAL FASTER! *
;**************************************
;
FDCRSR JSR INCPTR ;BUMP POINTER ON ONE
INC CRSRPN ;INCREMENT CURSOR POSITION
LDA #LINLEN ;LOAD ACCUMULATOR WITH LINELENGTH
CMP CRSRPN ;SAME AS CURSOR POSITION ?
BNE CRSROK ;NO - GO ON
CLC ;YES - ADD LINELENGTH TO CRSR LINEPTR
ADC CRSRLO ;ADD LO BYTE
STA CRSRLO ;STORE IT
LDA #0 ;GET 0
STA CRSRPN ;RESET CURSOR POSITION
ADC CRSRHI ;ADD HI BYTE + CARRY
STA CRSRHI ;STORE IT
INC CRSRLN ;BUMP CURRENT LINE
CRSROK RTS ;AND GO BACK
;
;**************************************
;* ROUTINE TO SIMULATE PRINTING A *
;* CURSOR LEFT CHARACTER. THIS IS *
;* USED INSTEAD OF ACTUALLY PRINTING *
;* A CURSOR LEFT AGAIN BECAUSE IT IS A*
;* GREAT DEAL FASTER! *
;**************************************
;
BKCRSR JSR DECPTR ;BUMP POINTER DOWN ONE
DEC CRSRPN ;DECREMENT CURSOR POSITION
BPL CRSROK ;IF STILL POSITIVE THEN OK!
LDA #LINLEN-1 ;IT'S BELOW ZERO - SET IT TO LINELENGTH-1
STA CRSRPN ;
SEC ;SUBTRACT LINELENGTH FROM CRSR LINEPTR
LDA CRSRLO ;GET LO BYTE
SBC #LINLEN ;SUBTRACT LENGTH OF LINE
STA CRSRLO ;STORE RESULT
LDA CRSRHI ;GET HI BYTE
SBC #0 ;SUBTRACT 'BORROW' (IF ANY)
STA CRSRHI
DEC CRSRLN
RTS ;AND GO BACK
;
;**************************************
;* ROUTINE TO HILIGHT THE CURRENT *
;* CURSOR POSITION. *
;**************************************
;
HILGHT LDY CRSRPN ;LOAD OFFSET
LDA (CRSRLO),Y ;GET CHR AT CURSOR POSITION
ORA #$80 ;HILGHT IT
STA (CRSRLO),Y ;PUT CHR BACK AT POSITION
RTS
;
;**************************************
;* ROUTINE TO UN-HILIGHT THE CURRENT *
;* CURSOR POSITION. *
;**************************************
;
UNFLSH LDY CRSRPN ;LOAD OFFSET
LDA (CRSRLO),Y ;GET CHR AT CURSOR POSITION
AND #$7F ;PUT IT OUT OF REVERSE
STA (CRSRLO),Y ;PUT CHR BACK AT POSITION
RTS
;
;**************************************
;* ROUTINE TO OUTPUT CHARACTER TO *
;* SCREEN. THE JSR ESCAPE IS USED *
;* RATHER THAN PRINTING AN ESCAPE *
;* CHARACTER, BECAUSE THIS CHARACTER *
;* IS NOT AVAILABLE ON THE 40 COLUMN *
;* PET, AND SO THIS ROUTINE SIMULATES *
;* IT. *
;**************************************
;
PRTCHR PHA ;SAVE CHARACTER TO BE PRINTED
JSR UNFLSH ;UN-HIGHLIGHT CURSOR POSITION
PLA ;GET CHARACTER TO PRINT
JSR PRINT ;PRINT IT
JSR ESCAPE ;DO AN ESCAPE
JSR HILGHT ;HIGHLIGHT NEW POSITION
UPDATE CLC ;UPDATE POINTERS
LDA CRSRPN ;GET CURSOR POSITION
ADC CRSRLO ;ADD LO BYTE OF START OF LINE
STA POINTR ;STORE IT
LDA #0 ;ADD CARRY TO HIGH BYTE
ADC CRSRHI ;
STA POINTR+1 ;STORE IT
RTS ;AND RETURN
;
;**************************************
;* ROUTINE TO SIMILATE PRINTING AN *
;* ESCAPE CHARACTER, AVAILABLE ON THE *
;* 80 COLUMN PET. THIS CHARACTER *
;* NULLIFIES THE AFFECT OF EITHER *
;* PRESSING THE INSERTION KEY, OR *
;* WHEN INSIDE QUOTES, I.E TO STOP *
;* CONTROL CHARACTERS BEING DISPLAYES *
;* LITERALLY. *
;**************************************
;
ESCAPE LDA #0 ;NULLIFY QUOTE MODE
STA QTEFLG
STA NUMINS ;AND SAY - NO INSERTS
LDA #OFFRVS ;LOAD AN OFF REVERSE
JMP PRINT ;PRINT IT AND RETURN
;
REGSAV .BYT 0,0,0,0,0,0 ;STORAGE AREA
;
;**************************************
;* ROUTINE TO SAVE CURRENT CURSOR *
;* POSITION AND THE CONTENTS OF THE *
;* POINTER 'POINTR'. *
;**************************************
;
SAVREG LDA CRSRLO ;GET CURSOR LINE LO
STA REGSAV ;SAVE IT
LDA CRSRHI ;GET CURSOR LINE HI
STA REGSAV+1 ;SAVE IT
LDA CRSRPN ;GET CURSOR POSITION
STA REGSAV+2 ;SAVE IT
LDA CRSRLN ;GET CURRENT LINE
STA REGSAV+3 ;SAVE IT
LDA POINTR ;GET POINTER LO
STA REGSAV+4 ;SAVE IT
LDA POINTR+1 ;GET POINTER HI
STA REGSAV+5 ;SAVE IT
RTS ;AND GO BACK
;
;**************************************
;* ROUTINE TO RESET CURRENT CURSOR *
;* POSITION AND THE POINTER 'POINTR' *
;* TO THE SAVED VALUES. *
;**************************************
;
RESREG LDA REGSAV ;GET CURSOR LINE LO
STA CRSRLO ;RESET IT
LDA REGSAV+1 ;GET CURSOR LINE HI
STA CRSRHI ;RESET IT
LDA REGSAV+2 ;GET CURSOR POSITION
STA CRSRPN ;RESET IT
LDA REGSAV+3 ;GET CURRENT LINE
STA CRSRLN ;RESET IT
LDA REGSAV+4 ;GET POINTER LO
STA POINTR ;RESET IT
LDA REGSAV+5 ;GET POINTER HI
STA POINTR+1 ;RESET IT
RTS ;AND GO BACK
;
;**************************************
;* CODE TO FIND SC$ ARRAY AND READ *
;* THE CONTENTS OF THE FIELDS INTO *
;* THE ARRAY, USING THE LENGTHS OF *
;* ARRAY ELEMENTS AS THE NUMBER OF *
;* CHARACTERS TO BE READ FROM THE *
;* START OF THE FIELD. IT WILL ABORT *
;* IF THE ARRAY DOES NOT EXIST, AN *
;* ELEMENT OF THE ARRAY IS NULL, THE *
;* END OF THE SCREEN IS REACHED, OR *
;* THE LAST ELEMENT OF THE ARRAY IS *
;* DONE. *
;**************************************
;
GETSTR LDA ARRTAB ;SET ARRPTR
STA ARRPTR ;TO FIND SC$ ARRAY
LDA ARRTAB+1
STA ARRPTR+1
JSR RESET
LDY #0 ;ZEROISE OFFSET
LOOP LDA (ARRPTR),Y ;LOAD VAR1
CMP #'S ;IS IT AN 'S' ?
BNE INC7 ;NO - GO ON
JSR ARRINC ;INCREMENT ARRAY PTR
LDA (ARRPTR),Y ;LOAD VAR2
CMP #195 ;SHIFTED 'C' ?
BNE INC6 ;NO - GO ON
JMP FOUND4 ;FOUND IT - GO ON
INC7 JSR ARRINC ;MOVE ON A BYTE
INC6 JSR ARRINC ;AND ANOTHER
LDA (ARRPTR),Y ;GET PTRLO TO NEXT ARRAY
STA REGSAV ;SAVE IT
JSR ARRINC ;MOVE ONTO NEXT BYTE
LDA (ARRPTR),Y ;GET PTRHI TO NEXT ARRAY
STA REGSAV+1 ;SAVE IT
LDA ARRPTR ;GET LO BYTE
CLC
ADC REGSAV ;ADD OFFSET LO
STA ARRPTR ;SET ARRAY PTR LO
LDA ARRPTR+1 ;GET HI BYTE
ADC REGSAV+1 ;ADD OFFSET HI
STA ARRPTR+1 ;SET ARRAY PTR HI
SEC
LDA ARRPTR ;SUBTRACT 3
SBC #3
STA ARRPTR
LDA ARRPTR+1
SBC #0
STA ARRPTR+1
;
LDA ARRPTR+1 ;END OF ARRAYS ?
CMP ARREND+1
BCC LOOP ;NO - KEEP LOOKING
BNE EXIT ;YES - EXIT
LDA ARRPTR ;LO BYTE ?
CMP ARREND
BCC LOOP ;NO - KEEP LOOKING
EXIT JMP FINISH ;AND RETURN
;
FOUND4 JSR ARRINC ;MOVE ONTO LO
JSR ARRINC ;& HI OF NEXT ARRAY
JSR ARRINC ;NUM DIMENSIONS
LDA (ARRPTR),Y ;GET IT
CMP #1 ;SINGLE DIMENSION ?
BEQ FOUND5 ;YES - GO ON
JMP FINISH ;NO - RETURN
FOUND5 JSR ARRINC ;HI OF ARRAY SIZE
JSR ARRINC ;LO OF ARRAY SIZE
LDA (ARRPTR),Y ;GET IT
STA COUNT ;SAVE IT
GT3 JSR ARRINC ;ONTO ARRAY ELEMENT
LDA (ARRPTR),Y ;GET LENGTH OF IT
BNE NOTNUL ;NOT NULL STRING - GO ON
JMP FINISH ;NUL STRING - STOP
NOTNUL TAX ;SAVE IT
JSR ARRINC ;MOVE ON ONE
LDA (ARRPTR),Y ;GET LO
STA STRPTR ;SET STRPTR LO
JSR ARRINC ;MOVE ON ONE
LDA (ARRPTR),Y ;GET HI
STA STRPTR+1 ;SET STRPTR HI
LDA STRPTR
SEC
SBC #1
STA STRPTR
LDA STRPTR+1
SBC #0
STA STRPTR+1
JSR SCANFD ;FIND FIELD ON SCREEN
BCC FILL ;FOUND ONE - GO ON
JMP FINISH ;NOT FOUND - RETURN
;
FILL TXA ;GET LENGTH
TAY ;SET OFFSET
FILL1 LDA (POINTR),Y
CONV1 PHA ;SAVE BIT 6
ASL A
ASL A
PLA
PHP
AND #$3F
CMP #$20
BCS CONV2
ORA #$40
CONV2 PLP
BCC CONV3
ORA #$80
CONV3 CMP #',
BEQ FIXIT
CMP #'"
BEQ FIXIT
CMP #':
BNE DONE
FIXIT ORA #64
DONE STA (STRPTR),Y
DEY
BNE FILL1
DEC COUNT ;MORE STRINGS ?
BNE MOREFD ;YES - GO ON
JMP FINISH ;NO - RETURN
MOREFD JSR FDCRSR ;BUMP CRSR & POINTER
JMP GT3
;
ACCMSG .BYT RVS,'PRESS SHIFT RETURN TO'
.BYT ' ACCEPT SCREEN.',OFFRVS,0
;
ERSMSG .BYT RVS,' '
.BYT ' ',OFFRVS,0
;
NOGOOD .BYT RVS,OFFRVS,ESC
; ------------- PROTECT FROM NASTIES ! --------------
.BYT 25,153,14,142,131,7,21,149,22,150,15,143
; ----------------------------------------------------
.BYT SHFESC,TAB,SHFTAB
.BYT OPENDL,CLSEDL,0
;
.END